关于c#:强制将excel窗口置于最前面?

您所在的位置:网站首页 excel 窗口 关于c#:强制将excel窗口置于最前面?

关于c#:强制将excel窗口置于最前面?

2024-07-09 16:09| 来源: 网络整理| 查看: 265

我有一个用C# .NET开发的小型应用程序,可以处理excel表格,我不知道为什么有些用户不断告诉我,尽管他们将excel设置为打开时,在打开excel文件时该窗口没有出现在顶部/顶部对true可见,并且窗口状态处于最大化状态。

这是读取excel文件的函数:

12345678910111213141516171819202122public static void OpenExcel(string fileName, bool visibility, FunctionToExecute fn = null) {     string addInPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"Microsoft\\\\AddIns\\\\mDF_XLcalendar.xla");     deleg = fn;     app = new Excel.Application();     app.Workbooks.Open(addInPath);     app.Workbooks.Open(fileName);     app.ScreenUpdating = true;     app.DisplayAlerts = true;     app.Visible = visibility;     app.UserControl = true;     app.WindowState = Excel.XlWindowState.xlMaximized;     EventDel_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeCloseEventHandler(application_WorkbookBeforeClose);     EventSave_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeSaveEventHandler(Open_ExcelApp_WorkbookBeforeSave);     app.WorkbookBeforeClose += EventDel_BeforeBookClose;     app.WorkbookBeforeSave += EventSave_BeforeBookClose;     }

有什么想法吗?

相关讨论 是因为您实际上在打开工作簿后正在设置WindowState吗? 如果您的.Net代码在Excel应用程序打开后仍需要执行一些代码,那么它将把焦点重新放在程序上。而且,如果您的程序具有GUI,则它将位于Excel之上。因此,您可以尝试的一件事是将打开Excel的行移至代码的末尾 我试过了,但是没用,问题是我无法在我的机器上重现该问题,因为它在我的机器上工作得很好... 我打开了一个Excel应用程序,并打开并最小化了2个excel工作簿,当我尝试(按工作簿名称)激活我想要的工作簿,然后尝试ap??p.activewindow.activate激活时,它并不总是使我想要的工作簿处于活动状态,友善的帮助

一些对我有用的魔法:

12app.WindowState = XlWindowState.xlMinimized; // -4140 app.WindowState = XlWindowState.xlMaximized; // -4137 相关讨论 此答案的好处是,即使应用程序尚未打开工作簿,它也可以工作。

我发现这行得通。如何将Excel应用程序置于最前面

1234567891011121314[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName);   public static void BringExcelWindowToFront(Application xlApp) {    string caption = xlApp.Caption;    IntPtr handler = FindWindow(null, caption);    SetForegroundWindow(handler); }

我会尝试通过

激活excel窗口

1app.ActiveWindow.Activate();

如果这不起作用,您可能会在此线程上找到其他解决方案(涉及本机WinAPI调用),网址为http://social.msdn.microsoft.com/

有时,如果在Excel中同时打开多个文件,则ActiveWindow.Activate()将不起作用。

一个成功的诀窍是最小化然后最大化命令。

我知道有点晚了,但是为什么需要使用FindWindow来通过应用程序访问Windows句柄:

12345678[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); public static void BringExcelWindowToFront(Application xlApp) {    SetForegroundWindow((IntPtr)xlApp.Hwnd);  // Note Hwnd is declared as int }

如果多个窗口具有相同的标题,将没有问题。

要激活特定的工作簿,请执行以下操作:

123456789101112131415  [DllImport("user32.dll")]   [return: MarshalAs(UnmanagedType.Bool)]   static extern bool SetForegroundWindow(IntPtr hWnd);   public static void BringExcelWindowToFront(Excel._Workbook xlBook)   {      var windows = xlBook.Windows;      foreach (Excel.Window window in windows)      {         IntPtr handler = (IntPtr)window.Hwnd;         SetForegroundWindow(handler);         return;      }   }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3